package com.yc.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.*;
import com.yc.vo.StudentAttendanceRecord;
import org.apache.ibatis.annotations.Insert;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yc.common.handler.MapResultHandler;
import com.yc.vo.StudentEdit;
import com.yc.vo.StudentInfoAndClassInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.yc.entity.StudentInfo;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

import java.util.List;

/**
 * 学生表;(student_info)表数据库访问层
 * @date : 2023-6-28
 */
@Mapper
public interface StudentInfoMapper  extends BaseMapper<StudentInfo>{
    /**
     * 根据学号查cid
     * @param stuid
     * @return
     */

    @Select("select cid from student_info where stuid = #{stuid} ")
    int queryCid(@Param("stuid") String stuid);



    /**
     * 学生修改密码
     * @param pwd
     * @param stuid
     */
    @Update("update student_info set password = #{pwd} where stuid = #{stuid}")
    void updatePwd(@Param("pwd") String pwd, @Param("stuid") String stuid);
    /**
     * 查询学生姓名班级学号学生权限
     * @param stuid
     * @return
     */
    @Select("select s.stuid,s.sname,c.cname,s.spare,s.wxpic,c.id from student_info s JOIN class_info c on s.cid = c.id  where s.stuid =#{stuid}")
    Map<String ,Object> queryByStuid(@Param("stuid") String stuid);

    /**
     * 分页查询指定行数据
     *
     * @param page 分页参数
     * @param wrapper 动态查询条件
     * @return 分页对象列表
     */
    IPage<StudentInfo> selectByPage(IPage<StudentInfo> page , @Param(Constants.WRAPPER) Wrapper<StudentInfo> wrapper);

    /**
     * 查询studentinfo有没有学生信息
     */
    @Select("select appid,wxpic,imei from student_info where stuid = #{username}")
            StudentInfo selectByStuid(@Param("username") String username);

    /**
     * 添加微信授权数据到student_info 根据学号添加
     */
    @Insert("update student_info set appid= #{appid}, wxpic=#{wxpic}, imei=#{imei}  where stuid = #{username}")
    void insertBystuid(@Param("appid") String appid,@Param("wxpic") String wxpic,@Param("imei") String imei,@Param("username")String stuid);

    /**
     * 根据学号查学生信息
     * @param stuid
     * @return
     */
    @Select("select * from student_info where stuid =#{stuid}")
    StudentInfo selectByUsername(@Param("stuid") String stuid);

    /**
     * 查出密码
     * @param stuid
     * @return
     */
    @Select("select password from student_info where stuid =#{stuid}")
    String queryPwd(@Param("stuid") String stuid);

    /**
     *查询当天课程
     * @param stuid
     * @param date
     * @return
     */
    @Select("select DISTINCT s.coursename,s.classtime from `schedule` s INNER JOIN student_info t on s.classId =t.cid  WHERE s.date like CONCAT(#{date},'%') AND t.stuid= #{stuid} ORDER BY classtime")
    List<Map<String,Object>> querySch(@Param("stuid") String stuid,@Param("date") String date);

    /**
     * 通过班级ID查询单条数据
     *
     * @param cid 班级主键
     * @return 实例对象
     */
    int queryByCid(@Param("cid") Integer cid);

    /**
     * 多表分页 带条件查询
     *
     * @param page 分页
     * @param studentEdit 查询条件
     * @return
     */
    Page<StudentInfoAndClassInfo> selectStudentInfoAndClassInfo(Page<StudentInfoAndClassInfo> page, StudentEdit studentEdit);

    /**
     * 添加学生
     * @param studentInfo 编辑学生的信息
     * @return 1 成功 0 失败
     */
    int addStudent(StudentInfo studentInfo);

    /**
     * 修改学生信息
     * @param studentInfo 编辑学生的信息
     * @return  1 成功 0 失败
     */
    int modifyStudent(StudentInfo studentInfo);

    /**
     * 查找该学生id是否存在
     * @param studentInfo 学生信息
     * @return  为 空 则不存在 ，否则 异常
     */
    Integer selectStudentExists(StudentInfo studentInfo);

    /**
     * 任命为班长或学委
     * @param studentInfo 学生信息
     * @return  1 成功 0 失败
     */
    int appointStudent(StudentInfo studentInfo);

    /**
     * 撤职，重新任命
     * @param studentInfo
     * @return
     */
    int removeCom(StudentInfo studentInfo);

    /**
     * 批量添加学生
     * @param studentInfoList 学生列表
     * @return 成功
     */
    int addStudentList(List<StudentInfo> studentInfoList);

    /**
     * 查询所有的学生
     * @param mapResultHandler
     */
    Map selectAllStudent(MapResultHandler<String, String> mapResultHandler);

    /**
     * 重置学生密码
     * @param id
     * @return 0 失败 1 成功
     */
    int resetPassword(Integer id, String password);

    /**
     *@Description 通过班级id查询班级学生
     *@Return
     *@Author dm
     *@Date Created in 2023/7/13 11:04
     **/
    List<StudentInfo> queryAllByClassId(@Param("classId")String classId);

    /**
     * 通过cid查询出班级所在的学生
     * @param scheduleId 课程Id
     * @param cid 班级Id
     * @return
     */
    List<StudentAttendanceRecord> selectStudentInfoByCid(@Param("scheduleId") String scheduleId, @Param("cid") String cid);

    /**
     * 通过cid查询出班级所在的学生
     * @param cid
     * @return
     */
    List<StudentAttendanceRecord> selectStudentsByCid(String cid);


    Page<StudentInfo> selectPageStudentInfoByCid(Page<StudentInfo> studentInfoPage, String cid);

    /**
     * 根据专业或者班级查考勤统计
     * @param stuid
     * @return
     */
    List<Map<String,Object>> selectBystuSum ( @Param("stuid") String stuid);

    List<Map<String,Object>> selectBystuInfoSum( @Param("cname") String cname);
}
